import 'dart:async';
import 'package:amap_flutter_location/amap_flutter_location.dart';
import 'package:amap_flutter_location/amap_location_option.dart';
import 'package:permission_handler/permission_handler.dart';
import 'map_common_config.dart';
import 'dart:io';

class LocationGeodeUtils {
 static late StreamSubscription<Map<String, Object>>? locationListener;
  static void getCurrentLocation(AMapFlutterLocation locationPlugin,
      {Function? locationBlock}) async {
    /// [hasShow] 隐私权政策是否弹窗展示告知用户
    AMapFlutterLocation.updatePrivacyShow(true, true);

    /// [hasAgree] 隐私权政策是否已经取得用户同意
    AMapFlutterLocation.updatePrivacyAgree(true);

    /// 动态申请定位权限
    requestPermission();
    AMapFlutterLocation.setApiKey(
        MapCommonConfig.androidKey, MapCommonConfig.iosMapKey);

    ///iOS 获取native精度类型
    if (Platform.isIOS) {
      requestAccuracyAuthorization(locationPlugin);
    }
    startLocation(locationPlugin);

    ///注册定位结果监听
     locationListener =
        locationPlugin.onLocationChanged().listen((Map<String, Object> result) {
      Map<String, Object> locationResult = result;
      double latitude = double.parse(result['latitude'].toString());
      double longitude = double.parse(result['longitude'].toString());
      print('已经拿到定位数据'+result.toString());
      if (locationBlock != null) {
        locationBlock(latitude, longitude, locationResult);
      }
    });
  }

  /// 动态申请定位权限
  static requestPermission() async {
    bool hasLocationPermission = await requestLocationPermission();
    if (hasLocationPermission) {
      print("定位权限申请通过");
    } else {
      print("定位权限申请不通过");
    }
  }

  /// 授予定位权限返回true， 否则返回false
  static Future<bool> requestLocationPermission() async {
    //获取当前的权限
    var status = await Permission.location.status;
    if (status == PermissionStatus.granted) {
      //已经授权
      return true;
    } else {
      //未授权则发起一次申请
      status = await Permission.location.request();
      if (status == PermissionStatus.granted) {
        return true;
      } else {
        return false;
      }
    }
  }

  ///获取iOS native的accuracyAuthorization类型
  static requestAccuracyAuthorization(
      AMapFlutterLocation locationPlugin) async {
    AMapAccuracyAuthorization currentAccuracyAuthorization =
        await locationPlugin.getSystemAccuracyAuthorization();
    if (currentAccuracyAuthorization ==
        AMapAccuracyAuthorization.AMapAccuracyAuthorizationFullAccuracy) {
      print("精确定位类型");
    } else if (currentAccuracyAuthorization ==
        AMapAccuracyAuthorization.AMapAccuracyAuthorizationReducedAccuracy) {
      print("模糊定位类型");
    } else {
      print("未知定位类型");
    }
  }

  ///开始定位
  static void startLocation(AMapFlutterLocation locationPlugin) {
    if (null != locationPlugin) {
      ///开始定位之前设置定位参数
      setLocationOption(locationPlugin);
      locationPlugin.startLocation();
    }
  }

  ///设置定位参数
  static void setLocationOption(AMapFlutterLocation locationPlugin) {
    if (null != locationPlugin) {
      AMapLocationOption locationOption = AMapLocationOption();

      ///是否单次定位
      locationOption.onceLocation = true;

      ///是否需要返回逆地理信息
      locationOption.needAddress = true;

      ///逆地理信息的语言类型
      locationOption.geoLanguage = GeoLanguage.DEFAULT;

      locationOption.desiredLocationAccuracyAuthorizationMode =
          AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;

      locationOption.fullAccuracyPurposeKey = "AMapLocationScene";

      ///设置Android端连续定位的定位间隔
      locationOption.locationInterval = 2000;

      ///设置Android端的定位模式<br>
      ///可选值：<br>
      ///<li>[AMapLocationMode.Battery_Saving]</li>
      ///<li>[AMapLocationMode.Device_Sensors]</li>
      ///<li>[AMapLocationMode.Hight_Accuracy]</li>
      locationOption.locationMode = AMapLocationMode.Hight_Accuracy;

      ///设置iOS端的定位最小更新距离<br>
      locationOption.distanceFilter = -1;

      ///设置iOS端期望的定位精度
      /// 可选值：<br>
      /// <li>[DesiredAccuracy.Best] 最高精度</li>
      /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
      /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
      /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
      /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
      locationOption.desiredAccuracy = DesiredAccuracy.HundredMeters;

      ///设置iOS端是否允许系统暂停定位
      locationOption.pausesLocationUpdatesAutomatically = false;

      ///将定位参数设置给定位插件
      locationPlugin.setLocationOption(locationOption);
    }
  }

  ///停止定位
  static stopLocation(AMapFlutterLocation locationPlugin) {
    locationPlugin.stopLocation();
  }

  //销毁
  static disposeLocation(AMapFlutterLocation locationPlugin) {
    ///移除定位监听
    // if (null != locationListener) {
    //   locationListener?.cancel();
    // }

    ///销毁定位
    locationPlugin.destroy();
  }
}
